home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Games / Doom / VDoomPPC / c2p_ppc.s next >
Text File  |  1998-06-24  |  10KB  |  502 lines

  1. # Chunky2Planar algorithm, originally by James McCoull
  2. # Modified by Peter McGavin for variable size and depth
  3. # and "compare buffer" (hope I didn't slow it down too much)
  4. #
  5. # Ported by Frank Wille (phx) <frank@phoenix.owl.de> to PowerPC (04-Jan-98).
  6. #
  7. #     Cpu only solution VERSION 2
  8. #    Not optimized - directly ported from 040-source... (phx)
  9. #    bitplanes are assumed contiguous!
  10. #    analyse instruction offsets to check performance
  11.  
  12. #void c2p_6_ppc (__reg("r3") UBYTE *chunky_data,
  13. #                __reg("r4") PLANEPTR raster,
  14. #                __reg("r5") UBYTE *compare_buffer,
  15. #                __reg("r8") UBYTE *xlate,
  16. #                __reg("r6") ULONG plsiz,
  17. #                __reg("r7") BOOL palette_changed)
  18.  
  19. #void c2p_8_ppc (__reg("r3") UBYTE *chunky_data,
  20. #                __reg("r4") PLANEPTR raster,
  21. #                __reg("r5") UBYTE *compare_buffer,
  22. #                __reg("r6") ULONG plsiz)
  23.  
  24. # r3 -> width*height chunky pixels
  25. # r4 -> contiguous bitplanes
  26. # r5 -> compare buffer
  27. # r6 = width*height/8   (width*height must be a multiple of 32)
  28.  
  29. # GNU-make has some problems with quotes (e.g. in "depth=8"), so this
  30. # is a workaround (phx)
  31. .ifdef    depth8
  32. .set    depth,8
  33. .endif
  34. .ifdef    depth6
  35. .set    depth,6
  36. .endif
  37.  
  38.  
  39. .macro    merge        # in1,in2,tmp3,tmp4,mask,shift
  40. # \1 = abqr
  41. # \2 = ijyz
  42.     mr    \4,\2
  43.     lis    \3,(\5&0xffff0000)>>16
  44.     ori    \3,\3,\5&0xffff
  45.     and    \2,\2,\3
  46.     and    \3,\3,\1
  47.     xor    \1,\1,\3
  48.     xor    \4,\4,\2
  49.     slwi    \3,\3,\6
  50.     rotrwi    \4,\4,\6
  51.     or    \2,\2,\3
  52.     or    \1,\1,\4
  53. .endm
  54.  
  55. # translate 4 8-bit pixels to 6-bit EHB
  56. .macro    xlate        # offs1,dest2,mem3,xlate4,tmp5
  57.     lbz    \5,\1(\3)
  58.     lbzx    \5,\4,\5
  59.     rlwimi    \2,\5,24,0,7
  60.     lbz    \5,\1+8(\3)
  61.     lbzx    \5,\4,\5
  62.     rlwimi    \2,\5,16,8,15
  63.     lbz    \5,\1+16(\3)
  64.     lbzx    \5,\4,\5
  65.     rlwimi    \2,\5,8,16,23
  66.     lbz    \5,\1+24(\3)
  67.     lbzx    \5,\4,\5
  68.     rlwimi    \2,\5,0,24,31
  69. .endm
  70.  
  71.  
  72.     .text
  73.  
  74. .ifeq    depth-8
  75.     .global    c2p_8_ppc
  76. c2p_8_ppc:
  77. .else
  78. .ifeq    depth-6
  79.     .global    c2p_6_ppc
  80. c2p_6_ppc:
  81. .else
  82. .fail    "Unsupported depth! Try 6 or 8."
  83. .endif
  84. .endif
  85.  
  86.  
  87.     stwu    r1,-80(r1)
  88.     stmw    r14,4(r1)        # save all non-volatile registers
  89.  
  90. .ifle depth-6
  91.     mr    r31,r7            # video_palette_changed
  92.     mr    r29,r8            # xlate
  93. .endif
  94.  
  95. # r3 = chunky buffer
  96. # r4 = output area
  97. # r5 = compare buffer
  98. # r6 = plsiz
  99.  
  100.     mr    r12,r6            # r12 = plsiz
  101.  
  102.     slwi    r6,r6,3
  103.     add    r30,r3,r6        # r30 = end of chunky data
  104.  
  105. first_loop:
  106. .ifle depth-6
  107.     cmpwi    r31,0            # palette_changed?
  108.     bne    first_case
  109. .endif
  110.  
  111.     lwz    r6,0(r3)
  112.     lwz    r7,0(r5)
  113.     cmpw    r6,r7
  114.     bne    first_case
  115.     lwz    r6,4(r3)
  116.     lwz    r7,4(r5)
  117.     cmpw    r6,r7
  118.     bne    first_case
  119.     lwz    r6,8(r3)
  120.     lwz    r7,8(r5)
  121.     cmpw    r6,r7
  122.     bne    first_case
  123.     lwz    r6,12(r3)
  124.     lwz    r7,12(r5)
  125.     cmpw    r6,r7
  126.     bne    first_case
  127.     lwz    r6,16(r3)
  128.     lwz    r7,16(r5)
  129.     cmpw    r6,r7
  130.     bne    first_case
  131.     lwz    r6,20(r3)
  132.     lwz    r7,20(r5)
  133.     cmpw    r6,r7
  134.     bne    first_case
  135.     lwz    r6,24(r3)
  136.     lwz    r7,24(r5)
  137.     cmpw    r6,r7
  138.     bne    first_case
  139.     lwz    r6,28(r3)
  140.     lwz    r7,28(r5)
  141.     cmpw    r6,r7
  142.     bne    first_case
  143.  
  144.     addi    r4,r4,4            # skip 32 pixels on output
  145.     addi    r3,r3,32
  146.     addi    r5,r5,32
  147.  
  148.     cmplw    r3,r30
  149.     blt    first_loop
  150.     b    exit            # exit if no changes found
  151.  
  152. first_case:
  153. .ifgt depth-6            # depth 8 code --- no need to xlate pixels
  154. # hint from M68k: d0-d3 -> r8-r11,  d4-d7 -> r14-r17
  155.     lwz    r9,0(r3)
  156.     lwz    r11,4(r3)
  157.     lwz    r8,8(r3)
  158.     lwz    r10,12(r3)
  159.     lwz    r14,2(r3)
  160.     lwz    r15,10(r3)
  161.     lwz    r16,6(r3)
  162.     lwz    r17,14(r3)
  163.  
  164.     stw    r9,0(r5)
  165.     stw    r11,4(r5)
  166.     stw    r8,8(r5)
  167.     stw    r10,12(r5)
  168.  
  169.     lwz    r6,16(r3)
  170.     rlwimi    r9,r6,0,16,31
  171.     rlwimi    r14,r6,16,16,31
  172.     lwz    r6,20(r3)
  173.     rlwimi    r11,r6,0,16,31
  174.     rlwimi    r16,r6,16,16,31
  175.     lwz    r6,24(r3)
  176.     rlwimi    r8,r6,0,16,31
  177.     rlwimi    r15,r6,16,16,31
  178.     lwz    r6,28(r3)
  179.     rlwimi    r10,r6,0,16,31
  180.     rlwimi    r17,r6,16,16,31
  181.  
  182.     sth    r9,16(r5)
  183.     sth    r8,24(r5)
  184.     sth    r11,20(r5)
  185.     sth    r10,28(r5)
  186.     sth    r14,18(r5)
  187.     sth    r15,26(r5)
  188.     sth    r16,22(r5)
  189.     sth    r17,30(r5)
  190.  
  191.     merge    r9,r8,r6,r7,0x00ff00ff,8
  192.     merge    r11,r10,r6,r7,0x00ff00ff,8
  193.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  194.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  195.  
  196.     merge    r14,r15,r6,r7,0x00ff00ff,8
  197.     merge    r16,r17,r6,r7,0x00ff00ff,8
  198.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  199.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  200.  
  201.     merge    r11,r16,r6,r7,0x33333333,2
  202.     merge    r10,r17,r6,r7,0x33333333,2
  203.     merge    r11,r10,r6,r7,0x55555555,1
  204.     merge    r16,r17,r6,r7,0x55555555,1
  205.  
  206.     mr    r18,r17            # plane0
  207.     mr    r19,r16            # plane1
  208.     mr    r20,r10            # plane2
  209.     mr    r21,r11            # plane3
  210.  
  211.     merge    r9,r14,r6,r7,0x33333333,2
  212.     merge    r8,r15,r6,r7,0x33333333,2
  213.     merge    r9,r8,r6,r7,0x55555555,1
  214.     merge    r14,r15,r6,r7,0x55555555,1
  215.  
  216.     mr    r22,r15            # plane4
  217.     mr    r23,r14            # plane5
  218.     mr    r24,r8            # plane6
  219.     mr    r25,r9            # plane7
  220.  
  221.  
  222. .else                # depth 6 code, xlate from 8-bit to 6-bit EHB
  223.     lwz    r6,0(r3)    # copy to compare buffer
  224.     stw    r6,0(r5)
  225.     lwz    r6,4(r3)
  226.     stw    r6,4(r5)
  227.     lwz    r6,8(r3)
  228.     stw    r6,8(r5)
  229.     lwz    r6,12(r3)
  230.     stw    r6,12(r5)
  231.     lwz    r6,16(r3)
  232.     stw    r6,16(r5)
  233.     lwz    r6,20(r3)
  234.     stw    r6,20(r5)
  235.     lwz    r6,24(r3)
  236.     stw    r6,24(r5)
  237.     lwz    r6,28(r3)
  238.     stw    r6,28(r5)
  239.  
  240.     xlate    0,r9,r3,r29,r7        # does 8-bit to EHB colour translate
  241.     xlate    1,r8,r3,r29,r7        # 4 pixels at a time
  242.     xlate    4,r11,r3,r29,r7
  243.     xlate    5,r10,r3,r29,r7
  244.  
  245.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  246.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  247.  
  248.     xlate    2,r14,r3,r29,r7
  249.     xlate    3,r15,r3,r29,r7
  250.     xlate    6,r16,r3,r29,r7
  251.     xlate    7,r17,r3,r29,r7
  252.  
  253.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  254.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  255.  
  256.     merge    r11,r16,r6,r7,0x33333333,2
  257.     merge    r10,r17,r6,r7,0x33333333,2
  258.  
  259.     merge    r11,r10,r6,r7,0x55555555,1
  260.     merge    r16,r17,r6,r7,0x55555555,1
  261.  
  262.     mr    r18,r17            # plane0
  263.     mr    r19,r16            # plane1
  264.     mr    r20,r10            # plane2
  265.     mr    r21,r11            # plane3
  266.  
  267.     merge    r9,r14,r6,r7,0x33333333,2
  268.     merge    r8,r15,r6,r7,0x33333333,2
  269.     merge    r14,r15,r6,r7,0x55555555,1
  270.  
  271.     mr    r22,r15            # plane4
  272.     mr    r23,r14            # plane5
  273. .endif
  274.  
  275.     addi    r3,r3,32
  276.     addi    r5,r5,32
  277.     mr    r26,r4            # save output address
  278.     addi    r4,r4,4            # skip 32 pixels on output
  279.  
  280.     cmplw    r3,r30
  281.     bge    final_case
  282.  
  283.  
  284. main_loop:
  285. .ifle depth-6
  286.     cmpwi    r31,0            # palette_changed?
  287.     bne    first_case
  288. .endif
  289.     lwz    r6,0(r3)        # compare next 32 pixels
  290.     lwz    r7,0(r5)
  291.     cmpw    r6,r7
  292.     bne    main_case
  293.     lwz    r6,4(r3)
  294.     lwz    r7,4(r5)
  295.     cmpw    r6,r7
  296.     bne    main_case
  297.     lwz    r6,8(r3)
  298.     lwz    r7,8(r5)
  299.     cmpw    r6,r7
  300.     bne    main_case
  301.     lwz    r6,12(r3)
  302.     lwz    r7,12(r5)
  303.     cmpw    r6,r7
  304.     bne    main_case
  305.     lwz    r6,16(r3)
  306.     lwz    r7,16(r5)
  307.     cmpw    r6,r7
  308.     bne    main_case
  309.     lwz    r6,20(r3)
  310.     lwz    r7,20(r5)
  311.     cmpw    r6,r7
  312.     bne    main_case
  313.     lwz    r6,24(r3)
  314.     lwz    r7,24(r5)
  315.     cmpw    r6,r7
  316.     bne    main_case
  317.     lwz    r6,28(r3)
  318.     lwz    r7,28(r5)
  319.     cmpw    r6,r7
  320.     bne    main_case
  321.  
  322.     addi    r4,r4,4            # skip 32 pixels on output
  323.     addi    r3,r3,32
  324.     addi    r5,r5,32
  325.  
  326.     cmplw    r3,r30
  327.     blt    main_loop
  328.     b    final_case        # exit if no more changes found
  329.  
  330.  
  331. main_case:
  332. .ifgt    depth-6
  333.     lwz    r9,0(r3)
  334.     lwz    r11,4(r3)
  335.     lwz    r8,8(r3)
  336.     lwz    r10,12(r3)
  337.     lwz    r14,2(r3)
  338.     lwz    r15,10(r3)
  339.     lwz    r16,6(r3)
  340.     lwz    r17,14(r3)
  341.  
  342.     stw    r9,0(r5)
  343.     stw    r11,4(r5)
  344.     stw    r8,8(r5)
  345.     stw    r10,12(r5)
  346.  
  347.     lwz    r6,16(r3)
  348.     rlwimi    r9,r6,0,16,31
  349.     rlwimi    r14,r6,16,16,31
  350.     lwz    r6,20(r3)
  351.     rlwimi    r11,r6,0,16,31
  352.     rlwimi    r16,r6,16,16,31
  353.     lwz    r6,24(r3)
  354.     rlwimi    r8,r6,0,16,31
  355.     rlwimi    r15,r6,16,16,31
  356.     lwz    r6,28(r3)
  357.     rlwimi    r10,r6,0,16,31
  358.     rlwimi    r17,r6,16,16,31
  359.  
  360.     sth    r9,16(r5)
  361.     sth    r8,24(r5)
  362.     sth    r11,20(r5)
  363.     sth    r10,28(r5)
  364.     sth    r14,18(r5)
  365.     sth    r15,26(r5)
  366.     sth    r16,22(r5)
  367.     sth    r17,30(r5)
  368.  
  369.     sub    r26,r26,r12
  370.     stwux    r18,r26,r12        # store plane0 (r26 += plsiz)
  371.     merge    r9,r8,r6,r7,0x00ff00ff,8
  372.     merge    r11,r10,r6,r7,0x00ff00ff,8
  373.  
  374.     stwux    r19,r26,r12        # store plane1 (r26 += plsiz)
  375.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  376.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  377.  
  378.     stwux    r20,r26,r12        # store plane2 (r26 += plsiz)
  379.     merge    r14,r15,r6,r7,0x00ff00ff,8
  380.     merge    r16,r17,r6,r7,0x00ff00ff,8
  381.  
  382.     stwux    r21,r26,r12        # store plane3 (r26 += plsiz)
  383.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  384.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  385.  
  386.     stwux    r22,r26,r12        # store plane4 (r26 += plsiz)
  387.     merge    r11,r16,r6,r7,0x33333333,2
  388.     merge    r10,r17,r6,r7,0x33333333,2
  389.  
  390.     stwux    r23,r26,r12        # store plane5 (r26 += plsiz)
  391.     merge    r11,r10,r6,r7,0x55555555,1
  392.     merge    r16,r17,r6,r7,0x55555555,1
  393.  
  394.     mr    r18,r17            # plane0
  395.     mr    r19,r16            # plane1
  396.     mr    r20,r10            # plane2
  397.     mr    r21,r11            # plane3
  398.  
  399.     stwux    r24,r26,r12        # store plane6 (r26 += plsiz)
  400.     merge    r9,r14,r6,r7,0x33333333,2
  401.     merge    r8,r15,r6,r7,0x33333333,2
  402.  
  403.     stwux    r25,r26,r12        # store plane7 (r26 += plsiz)
  404.     merge    r9,r8,r6,r7,0x55555555,1
  405.     merge    r14,r15,r6,r7,0x55555555,1
  406.  
  407.     mr    r22,r15            # plane4
  408.     mr    r23,r14            # plane5
  409.     mr    r24,r8            # plane6
  410.     mr    r25,r9            # plane7
  411.  
  412.  
  413. .else                # depth 6 code, xlate from 8-bit to 6-bit EHB
  414.     lwz    r6,0(r3)
  415.     stw    r6,0(r5)
  416.     lwz    r6,4(r3)
  417.     stw    r6,4(r5)
  418.     lwz    r6,8(r3)
  419.     stw    r6,8(r5)
  420.     lwz    r6,12(r3)
  421.     stw    r6,12(r5)
  422.     lwz    r6,16(r3)
  423.     stw    r6,16(r5)
  424.     lwz    r6,20(r3)
  425.     stw    r6,20(r5)
  426.     lwz    r6,24(r3)
  427.     stw    r6,24(r5)
  428.     lwz    r6,28(r3)
  429.     stw    r6,28(r5)
  430.  
  431.     xlate    0,r9,r3,r29,r7        # does 8-bit to EHB colour translate
  432.     xlate    1,r8,r3,r29,r7        # 4 pixels at a time
  433.     xlate    4,r11,r3,r29,r7
  434.     xlate    5,r10,r3,r29,r7
  435.  
  436.     sub    r26,r26,r12
  437.     stwux    r18,r26,r12        # store plane0 (r26 += plsiz)
  438.     merge    r9,r11,r6,r7,0x0f0f0f0f,4
  439.     merge    r8,r10,r6,r7,0x0f0f0f0f,4
  440.  
  441.     xlate    2,r14,r3,r29,r7
  442.     xlate    3,r15,r3,r29,r7
  443.     xlate    6,r16,r3,r29,r7
  444.     xlate    7,r17,r3,r29,r7
  445.  
  446.     stwux    r19,r26,r12        # store plane1 (r26 += plsiz)
  447.     merge    r14,r16,r6,r7,0x0f0f0f0f,4
  448.     merge    r15,r17,r6,r7,0x0f0f0f0f,4
  449.  
  450.     stwux    r20,r26,r12        # store plane2 (r26 += plsiz)
  451.     merge    r11,r16,r6,r7,0x33333333,2
  452.     merge    r10,r17,r6,r7,0x33333333,2
  453.  
  454.     stwux    r21,r26,r12        # store plane3 (r26 += plsiz)
  455.     merge    r11,r10,r6,r7,0x55555555,1
  456.     merge    r16,r17,r6,r7,0x55555555,1
  457.  
  458.     mr    r18,r17            # plane0
  459.     mr    r19,r16            # plane1
  460.     mr    r20,r10            # plane2
  461.     mr    r21,r11            # plane3
  462.  
  463.     stwux    r22,r26,r12        # store plane4 (r26 += plsiz)
  464.     merge    r9,r14,r6,r7,0x33333333,2
  465.  
  466.     stwux    r23,r26,r12        # store plane5 (r26 += plsiz)
  467.     merge    r8,r15,r6,r7,0x33333333,2
  468.     merge    r14,r15,r6,r7,0x55555555,1
  469.  
  470.     mr    r22,r15            # plane4
  471.     mr    r23,r14            # plane5
  472. .endif
  473.  
  474.     addi    r3,r3,32
  475.     addi    r5,r5,32
  476.  
  477.     mr    r26,r4            # save output address
  478.     addi    r4,r4,4            # skip 32 pixels on output
  479.  
  480.     cmplw    r3,r30
  481.     blt    main_loop
  482.  
  483.  
  484.  
  485. final_case:
  486.     sub    r26,r26,r12
  487.     stwux    r18,r26,r12        # store plane0 (r26 += plsiz)
  488.     stwux    r19,r26,r12        # store plane1 (r26 += plsiz)
  489.     stwux    r20,r26,r12        # store plane2 (r26 += plsiz)
  490.     stwux    r21,r26,r12        # store plane3 (r26 += plsiz)
  491.     stwux    r22,r26,r12        # store plane4 (r26 += plsiz)
  492.     stwux    r23,r26,r12        # store plane5 (r26 += plsiz)
  493. .ifgt depth-6
  494.     stwux    r24,r26,r12        # store plane6 (r26 += plsiz)
  495.     stwux    r25,r26,r12        # store plane7 (r26 += plsiz)
  496. .endif
  497.  
  498. exit:
  499.     lmw    r14,4(r1)        # restore non-volatile registers
  500.     addi    r1,r1,80
  501.     blr
  502.